package com.xiaxueqi.web.security;

import java.util.Map;

import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.beans.factory.annotation.Autowired;

import com.niagara.dao.Page;
import com.niagara.service.base.BaseService;
import com.niagara.web.struts2.CRUDActionSupport;
import com.niagara.web.struts2.Struts2Utils;
import com.xiaxueqi.entity.security.AppUser;

/**
 * 用户管理Action.
 * 
 * 使用Struts2 convention-plugin annotation定义Action参数.
 * 
 * @author calvin
 */
@SuppressWarnings("serial")
@Results( { @Result(name = CRUDActionSupport.RELOAD, location = "user.action", type = "redirect") })
public class UserAction extends CRUDActionSupport<AppUser> {

	@Autowired
	private BaseService baseService;

	// 基本属性
	private AppUser entity;
	private Long id;
	private Page<AppUser> page;

	// 角色相关属性
	// private List<AppUser> allRoles; // 全部可选角色列表
	// private List<Long> checkedRoleIds; // 页面中钩选的角色id列表

	// 基本属性访问函数 //

	public AppUser getModel() {
		return entity;
	}

	@Override
	protected void prepareModel() throws Exception {
		if (id != null) {
			entity = baseService.get(AppUser.class, id);
		} else {
			entity = new AppUser();
		}
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Page<AppUser> getPage() {
		return page;
	}

	// CRUD Action 函数 //
	/**
	 * 用户打开用户列表页，访问/user.action a.执行默认的execute() 函数，实际执行list() 函数。
	 * b.list()函数查询列表放入某list变量，返回SUCCESS，默认跳转到user.jsp
	 * c.user.jsp取出action中的list变量进行渲染。
	 */
	@Override
	public String list() throws Exception {
		Map map = Struts2Utils.getParameters();
		Integer pageNo = Struts2Utils.getIntParameter(PARAMS_PAGENO, Integer
				.valueOf(1));
		this.page = this.baseService.findForPaging(AppUser.class, map, pageNo,
				DEFAULT_PAGE_SIZE);

		return SUCCESS;
	}

	/**
	 * 用户新增对象时，访问/user!input.action a.首先将id放入id变量，执行prepareInput()函数创建一个新的user变量
	 * b.input() 函数，返回INPUT，默认跳转到user-input.jsp c.user-input.jsp
	 * 执行getModel()获得user变量渲染input框
	 */
	@Override
	public String input() throws Exception {
		// 这次什么都不做，prepareModel已经取得数据
		return INPUT;
	}

	/**
	 * 用户提交Form，访问/user!save.action
	 * a.执行preparedSave()函数创建新的user变量，将input框的内容绑定到getModel()获得的user变量
	 * b.执行save()函数保存user，返回RELOAD，跳转到@Result中定义RELOAD页面，以redirect方式重新打开/user.action
	 */
	@Override
	public String save() throws Exception {
		baseService.update(entity);
		addActionMessage("保存用户成功");
		return RELOAD;
	}

	@Override
	public String delete() throws Exception {
		baseService.remove(entity);
		addActionMessage("删除用户成功");
		return RELOAD;
	}

	// 其他属性访问函数与Action函数 //

	// public List<Role> getAllRoles() {
	// return allRoles;
	// }

	// public List<Long> getCheckedRoleIds() {
	// return checkedRoleIds;
	// }
	//
	// public void setCheckedRoleIds(List<Long> checkedRoleIds) {
	// this.checkedRoleIds = checkedRoleIds;
	// }

	/**
	 * 支持使用Jquery.validate Ajax检验用户名是否重复.
	 */
	// public String checkLoginName() {
	// HttpServletRequest request = ServletActionContext.getRequest();
	// String loginName = request.getParameter("loginName");
	// String orgLoginName = request.getParameter("orgLoginName");
	//
	// if (userManager.isLoginNameUnique(loginName, orgLoginName)) {
	// Struts2Utils.renderText("true");
	// } else {
	// Struts2Utils.renderText("false");
	// }
	// // 因为直接输出内容而不经过jsp,因此返回null.
	// return null;
	// }
}
